// 库函数
#include <stdio.h>
#include <stdbool.h>
#include "FreeRTOS.h"
#include "task.h"
#include "cmsis_os2.h"
// hal库函数
#include "main.h"
// 自定义函数
#include "irLedTask.h"

extern osEventFlagsId_t irSensorEvent; // 外部变量
static uint32_t g_deay_time = IR_SENSOR_DELAY_TIME_MS;

/* 接口函数：设置LED灯状态 */
void SetIRLedState(bool state)
{
    HAL_GPIO_WritePin(IR_LED_GPIO_Port, IR_LED_Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}

/* 接口函数：获取LED灯状态 */
bool GetIRLedState(void)
{
    return HAL_GPIO_ReadPin(IR_LED_GPIO_Port, IR_LED_Pin);
}

/* 接口函数：设置延时时间 */
void SetIrSensorDelayTime(uint32_t time)
{
    // 防止设置的延时时间过长
    if (time > 300 * 60)
    {
        printf("The software delay time is too long!\r\n");
        time = 300 * 60;
    }
    g_deay_time = time;
}

/* 中断回调函数 */
// 移动到sys.c文件中

/* 调试代码：是否有人过来 */
static void isPersonCome(void)
{
    // 有人时红外传感器输出高电平
    if (HAL_GPIO_ReadPin(IR_SENSOR_GPIO_Port, IR_SENSOR_Pin))
    {
        printf("[IrLedTask] SenseLed is bright!\r\n");
        SetIRLedState(true); // 点亮LED灯
    }
    else
    {
        printf("IrLedTask SenseLed is destroy!\r\n");
        SetIRLedState(false); // 熄灭LED灯
    }
}

/* 任务函数 */
static void IrLedTask(void *argument)
{
    (void)argument;

    uint32_t flags;
    GPIO_PinState inputVal;

    while (1)
    {
        flags = osEventFlagsWait(irSensorEvent, 0X0001, osFlagsWaitAny, osWaitForever);

        if (flags & 0X0001)
        {
            isPersonCome(); // 调试并点灯

            // 等待低电平
            do
            {
                inputVal = HAL_GPIO_ReadPin(IR_SENSOR_GPIO_Port, IR_SENSOR_Pin);
                osDelay(100);
            } while (inputVal == GPIO_PIN_SET);

            HAL_NVIC_DisableIRQ(EXTI2_IRQn); // 禁用EXTI2中断

            osDelay(g_deay_time); // 软件延时时间

            HAL_NVIC_EnableIRQ(EXTI2_IRQn); // 启用EXTI2中断

            isPersonCome(); // 调试并点灯

            osEventFlagsClear(irSensorEvent, 0X0001); // 清除事件标志
        }
    }
}

/* 入口函数 */
void IrLedTaskEnter(void)
{
    osThreadAttr_t attr = {
        .name = "IrLedTask",
        .stack_size = 2048,
        .priority = (osPriority_t)osPriorityNormal,
    };

    // 创建事件标志：移动到sys.c文件中的SYS_Init函数中

    //  创建任务
    if (osThreadNew((osThreadFunc_t)IrLedTask, (void *)NULL, &attr) == NULL)
    {
        printf("[IrLedTaskEnter] Failed to cerate IrLed task!\r\n");
        osEventFlagsDelete(irSensorEvent); // 删除事件标志
    }
}
